package wechat

import (
	"io"

	"github.com/ArtisanCloud/PowerWeChat/v3/src/kernel/power"
	"github.com/gin-gonic/gin"

	"gin-api-server/core_library/global"
	"gin-api-server/core_library/library/webengine/resp"
)

type GetMiniappOpenidRequest struct {
	Code string `form:"code"`
}

type GetMiniappOpenidResponse struct {
	Openid     string `json:"openid"`
	SessionKey string `json:"session_key"`
	UnionID    string `json:"union_id"`
}

// GetMiniappOpenidServer @noauth
// @Summary 获取小程序openid
// @Tags 微信.小程序
// @Accept  json
// @Produce json
// @Param code query string true "前端获取的code"
// @Router /wechat/getminiappopenid [get]
// @Success 200 {object}  GetMiniappOpenidResponse
func GetMiniappOpenidServer(c *gin.Context) {
	var reqBody GetMiniappOpenidRequest
	if err := c.ShouldBindQuery(&reqBody); err != nil {
		resp.FailWithMessage(c, "参数错误: "+err.Error())
		return
	}

	session, err := global.WechatMiniapp.Auth.Session(c.Request.Context(), reqBody.Code)
	if err != nil {
		resp.FailWithMessage(c, err.Error())
		return
	}
	resp.OkWithData(c, GetMiniappOpenidResponse{
		Openid:     session.OpenID,
		SessionKey: session.SessionKey,
		UnionID:    session.UnionID,
	})

}

type ExchangeMiniappMobileRequest struct {
	Code string `form:"code"`
}

type ExchangeMiniappMobileResponse struct {
	PhoneNumber     string `json:"mobile"`
	PurePhoneNumber string `json:"pure_mobile"`
	CountryCode     string `json:"country_code"`
}

// ExchangeMiniappMobileServer @noauth
// @Summary 置换微信小程序手机号
// @Tags  微信.小程序
// @Accept  json
// @Produce json
// @Param  code query string true "前端获取的code"
// @Router /wechat/exchangeminiappmobile [get]
// @Success 200 {object}  ExchangeMiniappMobileResponse
func ExchangeMiniappMobileServer(c *gin.Context) {
	var reqBody ExchangeMiniappMobileRequest
	if err := c.ShouldBindQuery(&reqBody); err != nil {
		resp.FailWithMessage(c, "参数错误: "+err.Error())
		return
	}
	number, err := global.WechatMiniapp.PhoneNumber.GetUserPhoneNumber(c.Request.Context(), reqBody.Code)
	if err != nil {
		resp.FailWithMessage(c, err.Error())
		return
	}
	if number.ErrCode != 0 {
		resp.FailWithMessage(c, number.ErrMsg)
		return
	}
	resp.OkWithData(c, ExchangeMiniappMobileResponse{
		PhoneNumber:     number.PhoneInfo.PhoneNumber,
		PurePhoneNumber: number.PhoneInfo.PurePhoneNumber,
		CountryCode:     number.PhoneInfo.CountryCode,
	})

}

type GetMiniappQrRequest struct {
	Page  string `json:"page"`  // 默认是主页，页面 page，例如 pages/index/index，根路径前不要填加 /，不能携带参数（参数请放在scene字段里），如果不填写这个字段，默认跳主页面。
	Scene string `json:"scene"` // 最大32个可见字符，只支持数字，大小写英文以及部分特殊字符：!#$&'()*+,/:;=?@-._~，其它字符请自行编码为合法字符（因不支持%，中文无法使用 urlencode 处理，请使用其他编码方式
	Width int    `json:"width"` // 默认430，二维码的宽度，单位 px，最小 280px，最大 1280px
}

type GetMiniappQrResponse struct {
}

// GetMiniappQrServer @noauth
// @Summary 获取小程序二维码
// @Tags  微信.小程序
// @Accept  json
// @Produce json
// @Param data body GetMiniappQrRequest true "参数"
// @Router /wechat/getminiappqr [post]
// @Success 200 file  string "直接返回二维码图片"
func GetMiniappQrServer(c *gin.Context) {
	var reqBody GetMiniappQrRequest
	if err := c.ShouldBindJSON(&reqBody); err != nil {
		resp.FailWithMessage(c, "参数错误: "+err.Error())
		return
	}

	unlimited, err := global.WechatMiniapp.WXACode.GetUnlimited(c.Request.Context(), reqBody.Scene, reqBody.Page, false, global.Config.Wechat.MiniApp.Model, int64(reqBody.Width), false, &power.HashMap{
		"r": 0,
		"g": 0,
		"b": 0,
	}, false)
	if err != nil {
		resp.FailWithMessage(c, err.Error())
		return
	}
	_, err = io.Copy(c.Writer, unlimited.Body)
	if err != nil {
		resp.FailWithMessage(c, err.Error())
		return
	}

}
